<!DOCTYPE html>
            
<HTML>
<HEAD>
<meta name="booktitle" content="Developing Applications With Objective Caml" >
 <meta charset="ISO-8859-1"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<META name="GENERATOR" content="hevea 1.05-7 of 2000-02-24">
<META NAME="Author" CONTENT="Christian.Queinnec@lip6.fr">
<LINK rel=stylesheet type="text/css" href="videoc-ocda.css">
<script language="JavaScript" src="videoc.js"><!--
//--></script>
<TITLE>
 Exercises
</TITLE>
</HEAD>
<BODY class="regularBody">
<A HREF="book-ora098.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora100.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
<HR>

<H2> Exercises</H2><A NAME="toc129"></A>
<H3> Tracing Function Application</H3>This exercise shows the evaluation of arguments at the moment of function application.
<OL type=1>
<LI>
 Activate tracing of the function
 <TT><A id="a212__1_APPEND/Aprogcor.ml.tex" href="javascript: void showMessage('1_APPEND/Aprogcor.ml.tex')" class="mousable"><SPAN style=""><!-- 1,APPEND/Aprogcor.ml.tex,fold-left -->List.fold_left</SPAN></A></TT>  
 and evaluate the following expression:


<PRE><BR>List.fold_left<CODE> </CODE><TT>(</TT><CODE>-</CODE><TT>)</TT><CODE> </CODE><CODE>1</CODE><CODE> </CODE><CODE>[</CODE><CODE>2</CODE>;<CODE> </CODE><CODE>3</CODE>;<CODE> </CODE><CODE>4</CODE>;<CODE> </CODE><CODE>5</CODE><CODE>]</CODE>;;<BR>

</PRE>

What does the <A id="a213__2_APPEND/Aprogcor.ml.tex" href="javascript: void showMessage('2_APPEND/Aprogcor.ml.tex')" class="mousable"><SPAN style=""><!-- 2,APPEND/Aprogcor.ml.tex,trace-fold-left -->trace</SPAN></A> show you?  
<!-- POPUP DEFINITION -->
<layer id="l__1_APPEND/Aprogcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","1_APPEND/Aprogcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># #trace<CODE> </CODE>List.fold_left<CODE> </CODE>;;<BR><CODE>List.fold_left is now traced.</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("1_APPEND/Aprogcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__2_APPEND/Aprogcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","2_APPEND/Aprogcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># List.fold_left<CODE> </CODE><TT>(</TT><CODE>-</CODE><TT>)</TT><CODE> </CODE><CODE>1</CODE><CODE> </CODE><CODE>[</CODE><CODE>2</CODE>;<CODE> </CODE><CODE>3</CODE>;<CODE> </CODE><CODE>4</CODE>;<CODE> </CODE><CODE>5</CODE><CODE>]</CODE><CODE> </CODE>;;<BR><CODE>List.fold_left &lt;-- &lt;fun&gt;</CODE><BR><CODE>List.fold_left --&gt; &lt;fun&gt;</CODE><BR><CODE>List.fold_left* &lt;-- &lt;poly&gt;</CODE><BR><CODE>List.fold_left* --&gt; &lt;fun&gt;</CODE><BR><CODE>List.fold_left** &lt;-- [&lt;poly&gt;; &lt;poly&gt;; &lt;poly&gt;; &lt;poly&gt;]</CODE><BR><CODE>List.fold_left &lt;-- &lt;fun&gt;</CODE><BR><CODE>List.fold_left --&gt; &lt;fun&gt;</CODE><BR><CODE>List.fold_left* &lt;-- &lt;poly&gt;</CODE><BR><CODE>List.fold_left* --&gt; &lt;fun&gt;</CODE><BR><CODE>List.fold_left** &lt;-- [&lt;poly&gt;; &lt;poly&gt;; &lt;poly&gt;]</CODE><BR><CODE>List.fold_left &lt;-- &lt;fun&gt;</CODE><BR><CODE>List.fold_left --&gt; &lt;fun&gt;</CODE><BR><CODE>List.fold_left* &lt;-- &lt;poly&gt;</CODE><BR><CODE>List.fold_left* --&gt; &lt;fun&gt;</CODE><BR><CODE>List.fold_left** &lt;-- [&lt;poly&gt;; &lt;poly&gt;]</CODE><BR><CODE>List.fold_left &lt;-- &lt;fun&gt;</CODE><BR><CODE>List.fold_left --&gt; &lt;fun&gt;</CODE><BR><CODE>List.fold_left* &lt;-- &lt;poly&gt;</CODE><BR><CODE>List.fold_left* --&gt; &lt;fun&gt;</CODE><BR><CODE>List.fold_left** &lt;-- [&lt;poly&gt;]</CODE><BR><CODE>List.fold_left &lt;-- &lt;fun&gt;</CODE><BR><CODE>List.fold_left --&gt; &lt;fun&gt;</CODE><BR><CODE>List.fold_left* &lt;-- &lt;poly&gt;</CODE><BR><CODE>List.fold_left* --&gt; &lt;fun&gt;</CODE><BR><CODE>List.fold_left** &lt;-- []</CODE><BR><CODE>List.fold_left** --&gt; &lt;poly&gt;</CODE><BR><CODE>List.fold_left** --&gt; &lt;poly&gt;</CODE><BR><CODE>List.fold_left** --&gt; &lt;poly&gt;</CODE><BR><CODE>List.fold_left** --&gt; &lt;poly&gt;</CODE><BR><CODE>List.fold_left** --&gt; &lt;poly&gt;</CODE><BR><CODE>- : int = -13</CODE><BR>

</PRE>
<BR>
<BR>
La trace indique seulement le passage des arguments � la fonction 
<TT>List.fold_left</TT>, mais n'affiche pas les valeurs des arguments.
La nature polymorphe des param�tres de <TT>List.fold_left</TT> emp�che
la trace de pouvoir afficher les valeurs des arguments pass�s.
</span><script language="JavaScript"><!--
  closePopUp("2_APPEND/Aprogcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Define the function <TT><A id="a214__3_APPEND/Aprogcor.ml.tex" href="javascript: void showMessage('3_APPEND/Aprogcor.ml.tex')" class="mousable"><SPAN style=""><!-- 3,APPEND/Aprogcor.ml.tex,def-fold-left-int -->fold_left_int</SPAN></A></TT>,  
 identical to <TT>List.fold_left</TT>, but with type: <BR>
<BR>
<TT>(</TT>int<CODE> </CODE>-&gt;<CODE> </CODE>int<CODE> </CODE>-&gt;<CODE> </CODE>int<TT>)</TT><CODE> </CODE>-&gt;<CODE> </CODE>int<CODE> </CODE>-&gt;<CODE> </CODE>int<CODE> </CODE>list<CODE> </CODE>-&gt;<CODE> </CODE>int.<BR><A id="a215__4_APPEND/Aprogcor.ml.tex" href="javascript: void showMessage('4_APPEND/Aprogcor.ml.tex')" class="mousable"><SPAN style=""><!-- 4,APPEND/Aprogcor.ml.tex,trace-int-fold-left -->Trace</SPAN></A> this function.  
Why is the output of the trace <A id="a216__5_APPEND/Aprogcor.ml.tex" href="javascript: void showMessage('5_APPEND/Aprogcor.ml.tex')" class="mousable"><SPAN style=""><!-- 5,APPEND/Aprogcor.ml.tex,ex-fold-left-int -->different</SPAN></A>?  
</OL>
<!-- POPUP DEFINITION -->
<layer id="l__3_APPEND/Aprogcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","3_APPEND/Aprogcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>fold_left_int<CODE> </CODE>f<CODE> </CODE><TT>(</TT>r<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int<TT>)</TT><CODE> </CODE><CODE> </CODE><TT>(</TT>l<CODE> </CODE><CODE>:</CODE><CODE> </CODE>int<CODE> </CODE>list<TT>)</TT><CODE> </CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><B>match</B><CODE> </CODE>l<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE>r<BR><CODE> </CODE><CODE>|</CODE><CODE> </CODE>t::q<CODE> </CODE>-&gt;<CODE> </CODE>fold_left_int<CODE> </CODE>f<CODE> </CODE><TT>(</TT>f<CODE> </CODE>r<CODE> </CODE>t<TT>)</TT><CODE> </CODE>q<CODE> </CODE>;;<BR><CODE>val fold_left_int : (int -&gt; int -&gt; int) -&gt; int -&gt; int list -&gt; int = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("3_APPEND/Aprogcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__4_APPEND/Aprogcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","4_APPEND/Aprogcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># #trace<CODE> </CODE>fold_left_int<CODE> </CODE>;;<BR><CODE>fold_left_int is now traced.</CODE><BR># fold_left_int<CODE> </CODE><TT>(</TT><CODE>-</CODE><TT>)</TT><CODE> </CODE><CODE>1</CODE><CODE> </CODE><CODE>[</CODE><CODE>2</CODE>;<CODE> </CODE><CODE>3</CODE>;<CODE> </CODE><CODE>4</CODE>;<CODE> </CODE><CODE>5</CODE><CODE>]</CODE><CODE> </CODE>;;<BR><CODE>fold_left_int &lt;-- &lt;fun&gt;</CODE><BR><CODE>fold_left_int --&gt; &lt;fun&gt;</CODE><BR><CODE>fold_left_int* &lt;-- 1</CODE><BR><CODE>fold_left_int* --&gt; &lt;fun&gt;</CODE><BR><CODE>fold_left_int** &lt;-- [2; 3; 4; 5]</CODE><BR><CODE>fold_left_int &lt;-- &lt;fun&gt;</CODE><BR><CODE>fold_left_int --&gt; &lt;fun&gt;</CODE><BR><CODE>fold_left_int* &lt;-- -1</CODE><BR><CODE>fold_left_int* --&gt; &lt;fun&gt;</CODE><BR><CODE>fold_left_int** &lt;-- [3; 4; 5]</CODE><BR><CODE>fold_left_int &lt;-- &lt;fun&gt;</CODE><BR><CODE>fold_left_int --&gt; &lt;fun&gt;</CODE><BR><CODE>fold_left_int* &lt;-- -4</CODE><BR><CODE>fold_left_int* --&gt; &lt;fun&gt;</CODE><BR><CODE>fold_left_int** &lt;-- [4; 5]</CODE><BR><CODE>fold_left_int &lt;-- &lt;fun&gt;</CODE><BR><CODE>fold_left_int --&gt; &lt;fun&gt;</CODE><BR><CODE>fold_left_int* &lt;-- -8</CODE><BR><CODE>fold_left_int* --&gt; &lt;fun&gt;</CODE><BR><CODE>fold_left_int** &lt;-- [5]</CODE><BR><CODE>fold_left_int &lt;-- &lt;fun&gt;</CODE><BR><CODE>fold_left_int --&gt; &lt;fun&gt;</CODE><BR><CODE>fold_left_int* &lt;-- -13</CODE><BR><CODE>fold_left_int* --&gt; &lt;fun&gt;</CODE><BR><CODE>fold_left_int** &lt;-- []</CODE><BR><CODE>fold_left_int** --&gt; -13</CODE><BR><CODE>fold_left_int** --&gt; -13</CODE><BR><CODE>fold_left_int** --&gt; -13</CODE><BR><CODE>fold_left_int** --&gt; -13</CODE><BR><CODE>fold_left_int** --&gt; -13</CODE><BR><CODE>- : int = -13</CODE><BR># #untrace_all<CODE> </CODE>;;<BR><CODE>fold_left_int is no longer traced.</CODE><BR><CODE>List.fold_left is no longer traced.</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("4_APPEND/Aprogcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__5_APPEND/Aprogcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","5_APPEND/Aprogcor.ml.tex","");
// --></script><span style="">
 La fonction <TT>fold_left_int</TT> est monomorphe. Le m�canisme 
de trace conna�t le type des arguments et peut alors les afficher lors
de leur passage.
</span><script language="JavaScript"><!--
  closePopUp("5_APPEND/Aprogcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>
<A NAME="toc130"></A>
<H3> Performance Analysis</H3>We continue the exercise proposed in chapter <A HREF="index.html#chap-GC">9</A>, page
<A HREF="index.html#chap-GC">??</A>, where we compared the evolution of the heap of two
programs (one tail recursive and the other not) for calculating
primes.
This time we will compare the execution times of each function with
the profiling tools. This exercise shows the importance of
inline expansion (see chapter <A HREF="index.html#chap-Compilation">7</A>).<BR>
<BR>
<OL type=1>
<LI>
 Compile the two programs <TT>erart</TT> and <TT>eranrt</TT>
 with profiling <A id="a217__6_APPEND/Aprogcor.ml.tex" href="javascript: void showMessage('6_APPEND/Aprogcor.ml.tex')" class="mousable"><SPAN style=""><!-- 6,APPEND/Aprogcor.ml.tex,profil-comp -->options</SPAN></A> using the 
 bytecode compiler and the native code compiler respectively.
<!-- POPUP DEFINITION -->
<layer id="l__6_APPEND/Aprogcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","6_APPEND/Aprogcor.ml.tex","");
// --></script><span style="">
 <PRE>
$ ocamlcp -custom -o era_rt_bc unix.cma interval.ml trgc.ml eras2.ml era2_main.ml main_rt.ml -cclib -lunix
$ ocamlcp -custom -o era_nrt unix.cma interval.ml trgc.ml eras.ml era2_main.ml main_nrt.ml -cclib -lunix
$ ocamlopt -p -o era_rt_nat unix.cmxa interval.ml trgc.ml eras2.ml era2_main.ml main_rt.ml -cclib -lunix
$  ocamlopt -p -o era_nrt_nat unix.cmxa interval.ml trgc.ml eras.ml era2_main.ml main_nrt.ml -cclib -lunix
</PRE></span><script language="JavaScript"><!--
  closePopUp("6_APPEND/Aprogcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> <A id="a218__7_APPEND/Aprogcor.ml.tex" href="javascript: void showMessage('7_APPEND/Aprogcor.ml.tex')" class="mousable"><SPAN style=""><!-- 7,APPEND/Aprogcor.ml.tex,profil-exe -->Execute</SPAN></A> the programs  
passing them the numbers 3000 4000 5000 6000 on the command line.
<!-- POPUP DEFINITION -->
<layer id="l__7_APPEND/Aprogcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","7_APPEND/Aprogcor.ml.tex","");
// --></script><span style="">
 <PRE>
$ era_rt_bc traceRT-BC 3000 4000 5000 6000
$ era_nrt_bc traceNRT-BC 3000 4000 5000 6000
$ era_rt_nat traceRT-NAT 3000 4000 5000 6000
$ era_nrt_nat traceNRT-NAT 3000 4000 5000 6000
</PRE></span><script language="JavaScript"><!--
  closePopUp("7_APPEND/Aprogcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> <A id="a219__8_APPEND/Aprogcor.ml.tex" href="javascript: void showMessage('8_APPEND/Aprogcor.ml.tex')" class="mousable"><SPAN style=""><!-- 8,APPEND/Aprogcor.ml.tex,profil-visu -->Visualize</SPAN></A> the results with the <TT>ocamlprof</TT> and <TT>gprof</TT> commands.  
 What can you <A id="a220__9_APPEND/Aprogcor.ml.tex" href="javascript: void showMessage('9_APPEND/Aprogcor.ml.tex')" class="mousable"><SPAN style=""><!-- 9,APPEND/Aprogcor.ml.tex,profil-analyse -->say</SPAN></A> about the results?  
<!-- POPUP DEFINITION -->
<layer id="l__8_APPEND/Aprogcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","8_APPEND/Aprogcor.ml.tex","");
// --></script><span style="">
 Compilateur de code-octet : <BR>
<BR>
La commande <TT>ocamlprof</TT> lit les informations du fichier <TT>camlprof.dump</TT>. Si 
plusieurs ex�cutions diff�rentes ont �t� lanc�es, seule l'information de cette
derni�re est accessible.<BR>
<BR>
Voici les informations ressorties pour la version r�cursive terminale : 
<PRE>
$ ocamlprof eras2.ml
(* fichier eras2.ml *)

let erart l  = 
  (* 4 *) let rec erart_aux l r = (* 2436 *) match l with 
    [] -&gt; (* 4 *) List.rev r
  | p::q -&gt; (* 2432 *) erart_aux  (List.filter ( fun x -&gt; (* 808410 *) x mod p &lt;&gt; 0) q) (p::r) 
  in 
    erart_aux l [] ;;

let erart_go n = 
  (* 4 *) erart (Interval.interval (&lt;)  (fun x -&gt; (* 17992 *) x + 1) 2 n) ;;
</PRE>et pour la version r�cursive terminale : 
<PRE>
$ ocamlprof eras.ml
(* fichier eras.ml *)

let rec eras l  = (* 2436 *) match l with 
  [] -&gt; (* 4 *) []
| p::q -&gt; (* 2432 *) p:: (eras (List.filter ( fun x -&gt; (* 808410 *) x mod p &lt;&gt; 0) q)) ;;

let era_go n = 
  (* 4 *) eras (Interval.interval (&lt;)  (fun x -&gt; (* 17992 *) x + 1) 2 n) ;;
</PRE>On s'aper�oit que dans les deux cas, il y a 2436 appels � la fonction principale, dont
4 avec une liste vide et 2432 dans l'autre cas. <BR>
<BR>
Attention le profilage rend invalide de nombreuses optimisations du compilateur. <BR>
<BR>
Compilateur natif :<BR>
<BR>
L'ex�cution d'un ex�cutable autonome natif compil� en mode <TT>-p</TT> produit un
fichier <TT>gmon.out</TT>.<BR>
<BR>
<PRE>
$ gprof era_rt_nat 
</PRE>affiche tout d'abord le temps pass� dans chaque fonction : 
<PRE>
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  us/call  us/call  name    
 44.44      0.12     0.12   808410     0.15     0.15  Eras2_fun_112
 18.52      0.17     0.05     2436    20.53    32.67  List_rev_append_57
 11.11      0.20     0.03     2432    12.34    73.68  List_find_213
  7.41      0.22     0.02      114   175.44   175.44  sweep_slice
  7.41      0.24     0.02       34   588.24   588.24  mark_slice
  3.70      0.25     0.01    76203     0.13     0.13  allocate_block
  3.70      0.26     0.01    64466     0.16     0.31  oldify
...
</PRE>puis le graphe d'appel.<BR>
<BR>
<PRE>
$ gprof era_nrt_nat 
</PRE>affiche tout d'abord le temps pass� dans chaque fonction : 
<PRE>
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  us/call  us/call  name    
 42.42      0.14     0.14   808410     0.17     0.17  Eras_code_begin
 15.15      0.19     0.05     2432    20.56    95.63  List_find_213
 15.15      0.24     0.05     2432    20.56    39.31  List_rev_append_57
  6.06      0.26     0.02    93936     0.21     0.53  oldify
  6.06      0.28     0.02    74519     0.27     0.27  allocate_block
  6.06      0.30     0.02       37   540.54   540.54  mark_slice
  3.03      0.31     0.01    74519     0.13     0.40  alloc_shr
...
</PRE></span><script language="JavaScript"><!--
  closePopUp("8_APPEND/Aprogcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__9_APPEND/Aprogcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","9_APPEND/Aprogcor.ml.tex","");
// --></script><span style="">
 L'outil <TT>ocamlprof</TT> compte le nombre d'appels ou de passage dans certaines parties
d'une fonction sans indication de temps.<BR>
<BR>
Par contre , l'outil <TT>gprof</TT> est plus pr�cis car il indique les temps 
pass�s dans chaque fonction.<BR>
<BR>
Attention les versions compil�es avec l'option <TT>-p</TT> effectuent un travail 
suppl�mentaire qui est perceptible lors de mesures de temps. Les versions 
<TT>.exe</TT> sont compil�es sans cette option.
<PRE>
$ time era_rt.exe a1 3000 4000 5000 6000
0.230u 0.010s 0:00.25 96.0%     0+0k 0+0io 129pf+0w
$ time era_rt_nat a2 3000 4000 5000 6000
0.510u 0.010s 0:00.52 100.0%    0+0k 0+0io 134pf+0w
$ time era_nrt.exe a3 3000 4000 5000 6000
0.220u 0.020s 0:00.24 100.0%    0+0k 0+0io 130pf+0w
$ time era_nrt_nat a4 3000 4000 5000 6000
0.520u 0.010s 0:00.53 100.0%    0+0k 0+0io 134pf+0w
$ visu a1
Nombre de Gc: mineur = 131, majeur = 20
$ visu a2
Nombre de Gc: mineur = 131, majeur = 20
$ visu a3
Nombre de Gc: mineur = 131, majeur = 23
$ visu a4
Nombre de Gc: mineur = 131, majeur = 23
</PRE><PRE>
$ gprof era_rt_nat 
</PRE></span><script language="JavaScript"><!--
  closePopUp("9_APPEND/Aprogcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL><HR>
<A HREF="book-ora098.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora100.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
</BODY>
</HTML>
